//
// Created by Leaf on 2025/8/19.
//

#include "buzzer.h"
#include <Arduino.h>

// 蜂鸣器控制类构造函数
Buzzer::Buzzer(uint8_t pin, BuzzerType type) : buzzer_pin(pin), buzzer_type(type), is_on(false) {
    pinMode(buzzer_pin, OUTPUT);
    digitalWrite(buzzer_pin, LOW); // 默认关闭蜂鸣器
}

// 打开蜂鸣器
void Buzzer::on() {
    if (buzzer_type == ACTIVE_BUZZER) {
        // 有源蜂鸣器直接输出高电平
        digitalWrite(buzzer_pin, HIGH);
        is_on = true;
        printf("Buzzer on\n");
    } else {
        // 无源蜂鸣器需要播放一个默认频率的声音
        playTone(1000); // 默认播放1kHz的声音
    }
}

// 关闭蜂鸣器
void Buzzer::off() {
    if (buzzer_type == ACTIVE_BUZZER) {
        // 有源蜂鸣器直接输出低电平
        digitalWrite(buzzer_pin, LOW);
    } else {
        // 无源蜂鸣器停止播放声音
        stopTone();
    }
    is_on = false;
}

// 切换蜂鸣器状态
void Buzzer::toggle() {
    if (isOn()) {
        off();
    } else {
        on();
    }
}

// 播放指定频率的声音（仅适用于无源蜂鸣器）
void Buzzer::playTone(uint16_t frequency, uint32_t duration) {
    if (buzzer_type == PASSIVE_BUZZER) {
        if (duration > 0) {
            tone(buzzer_pin, frequency, duration);
        } else {
            tone(buzzer_pin, frequency);
        }
        is_on = true;
    }
}

// 停止播放声音
void Buzzer::stopTone() {
    if (buzzer_type == PASSIVE_BUZZER) {
        noTone(buzzer_pin);
    }
    is_on = false;
}

// 检查蜂鸣器是否打开
bool Buzzer::isOn() const {
    if (buzzer_type == ACTIVE_BUZZER) {
        // 对于有源蜂鸣器，直接检查引脚状态
        return digitalRead(buzzer_pin) == HIGH;
    } else {
        // 对于无源蜂鸣器，返回内部状态
        return is_on;
    }
}

// 获取蜂鸣器类型
BuzzerType Buzzer::getType() const {
    return buzzer_type;
}